/*
 * conexion.c
 *
 *  Created on: 11/12/2009
 *      Author: teledhil
 */

#include <stdio.h>
#include <string.h>
#include <errno.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>

/*** WRITE_TO_SERVER()*********************************************/
int enviar(int fConexion, char *mensaje, int longMensaje) {

	return write(fConexion, mensaje, longMensaje);
}

/*** READ_FROM_SERVER()********************************************/
int recibir(int fConexion, char *mensaje, int longMensaje) {

	return read(fConexion, mensaje, longMensaje);
}

/*** INIT_SOCKADDR()***********************************************/
int init_sockaddr(struct sockaddr_in *nombre, const char *hostname, uint16_t puerto) {
	struct hostent *hostinfo;

	nombre->sin_family = AF_INET;
	nombre->sin_port = htons(puerto);
	hostinfo = gethostbyname(hostname);
	if (hostinfo == NULL) {
		fprintf(stderr, "Unknown host %s.\n", hostname);
		return -1;
	}
	nombre->sin_addr = *(struct in_addr *) hostinfo->h_addr;

	return 0;
}

/*** SOCKET_CLIENTE()****************************************************/
int socket_cliente(const char *hostname, int puerto) {

	int sock;
	struct sockaddr_in servername;

#ifdef PRUEBALIB
	fprintf(stderr,"\tSoy conectar, estoy en clienteServidor\n");
	return 1;
#endif

	/* Crea el socket */
	sock = socket(PF_INET, SOCK_STREAM, 0);
	if (sock < 0) {
		fprintf(stderr, "socket (client)");
		return -1;
	}

	/* Conecta con el servidor */
	init_sockaddr(&servername, hostname, puerto);
	if (0 > connect(sock, (struct sockaddr *) &servername, sizeof(servername))) {
		fprintf(stderr, "connect (client)");
		return -1;
	}

	return sock;
}

/*** SOCKET_SERVIDOR()****************************************************/
int socket_servidor(int puerto) {

	int sock;
	struct sockaddr_in name;

#ifdef PRUEBALIB
	fprintf(stderr,"\tSoy conectar, estoy en clienteServidor\n");
	return 1;
#endif

	/* Crea el socket */
	sock = socket(PF_INET, SOCK_STREAM, 0);
	if (sock < 0) {
		fprintf(stderr, "socket (client)");
		return -1;
	}

	/* Asocia el socket a un puerto */
	name.sin_family = AF_INET;
	name.sin_port = htons (puerto);
	name.sin_addr.s_addr = htonl (INADDR_ANY);
	if (bind (sock, (struct sockaddr *) &name, sizeof (name)) < 0) {
		perror ("bind");
		return -1;
	}

	/* set size of request queue to 10 */
	if (listen(sock, 10) < 0) {
		perror("listen");
		return -1;
	}

	return sock;
}

/*** ESPERAR_PETICION()****************************************************/
int esperar_peticion(int sock) {

	int conexion;

	conexion=accept(sock, NULL, NULL);

	if(conexion<0) {
		perror("accept");
	}

	return conexion;

}

/*** CERRAR_SOCKET()****************************************************/
int cerrar_socket(int sock) {

	return close(sock);

}




